package readwrite;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 读写锁, 独占锁的优化, 因为大部分时候都是读>写
 * 读是共享锁, 也是乐观锁
 * 写是独占锁, 也是悲观锁
 * 通过分离读写场景下的锁, 提升性能
 * 
 * ReentrantReadWriteLock: 支持公平机制, 可重入, 可降级
 * 可降级: 指的是支持在拥有写锁的情况下, 可以先获取读锁, 再释放写锁
 * 原因: 释放写锁后, 如果后续其他线程获得写锁, 当前线程无法感知最新数据
 * 
 * 就是使用等待通知机制手动实现读写锁, 后来使用读写锁, 更加简单
 * 
 * @author insight
 * @since 2021/9/13
 */
public class Cache {
    private Map<String, String> mp = new HashMap<>(8);
    private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    private Lock rl = rwl.readLock();
    private Lock wl = rwl.writeLock();

    public String put(String key, String value) {
        wl.lock();
        try {
            return mp.put(key, value);
        } finally {
          wl.unlock();  
        }
    }

    public String get(String key) {
        rl.lock();
        try {
            return mp.get(key);
        } finally {
            wl.unlock();
        }
    }
}